package proyecto.ort.edu.uy.dao.impl;

import java.util.ArrayList;
import java.util.List;

import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;
import javax.persistence.TypedQuery;

import proyecto.ort.edu.uy.dao.UsuarioDAOInterface;
import proyecto.ort.edu.uy.dominio.Empresa;
import proyecto.ort.edu.uy.dominio.GrupoUsuario;
import proyecto.ort.edu.uy.dominio.Usuario;

@Stateless
@SuppressWarnings("unchecked")
public class UsuarioDAOIml implements UsuarioDAOInterface {

	/**
	 * 
	 */
	private static final long serialVersionUID = 2037779643574781111L;

	@PersistenceContext(unitName = "PrototipoEM")
	private EntityManager em;

	@Override
	public void agregarUsuario(Usuario usuario) {
		this.em.persist(usuario);

	}

	@Override
	public void actualizarUsuario(Usuario usuario) {
		this.em.merge(usuario);

	}

	@Override
	public Usuario buscarUsuarioPorId(Long idUsuario) {
		String sql = "Select u From Usuario u Where idUsuario=:idUsuario";
		Query query = this.em.createQuery(sql);
		query.setParameter("idUsuario", idUsuario);
		// TODO Auto-generated method stub
		return (Usuario) query.getSingleResult();
	}

	@Override
	public List<Usuario> obtenerTodos() {
		String sql = "Select u From Usuario u";
		Query query = this.em.createQuery(sql);
		List<Usuario> lstUsuario = query.getResultList();
		// TODO Auto-generated method stub
		return lstUsuario;
	}

	@Override
	public Usuario loguearUsuario(Usuario usuario) {
		List<Usuario> usuarios = new ArrayList<Usuario>();
		String queryString = "Select u From Usuario u where u.username = :login and u.password = :pass";
		Query query = this.em.createQuery(queryString);
		query.setParameter("login", usuario.getUsername());
		query.setParameter("pass", usuario.getPassword());

		usuarios = query.getResultList();

		if (usuarios.isEmpty()) {
			return null;
		} else {
			// procesar la lista y devolver el usuario
			Usuario user = usuarios.get(0);
			return user;

		}
	}

	@Override
	public List<Usuario> obtenerListaUsuariosPorListaCodigos(List<Long> codigosUsuarios) {

		String sql = "Select u from Usuario u where u.idUsuario in :codigos";
		TypedQuery<Usuario> query = this.em.createQuery(sql, Usuario.class);
		query.setParameter("codigos", codigosUsuarios);

		List<Usuario> resultados = query.getResultList();

		return resultados;
	}

	@Override
	public List<Usuario> obtenerUsuariosDeLaEmpresa(Empresa e) {

		String sql = "select u from Usuario u where u.empresa = :empresa";
		TypedQuery<Usuario> query = this.em.createQuery(sql, Usuario.class);
		query.setParameter("empresa", e);

		List<Usuario> resultados = query.getResultList();
		return resultados;
	}

//	@Override
//	public List<GrupoUsuario> obtenerGruposUsuariosDeLaEmpresa(Empresa e) {
//
//		String sql = "select DISTINCT u.lstGrupoUsuarios from Usuario u where u.empresa = :empresa";
//		TypedQuery<GrupoUsuario> query = this.em.createQuery(sql, GrupoUsuario.class);
//		query.setParameter("empresa", e);
//
//		List<GrupoUsuario> resultados = query.getResultList();
//		return resultados;
//	}

	@Override
	public Usuario obtenerUsuario(Long idUsuario) {

		return this.em.find(Usuario.class, idUsuario);
	}

}
